<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        /* 
            构造函数：给对象动态的添加属性，返回这个对象
            语法结构：
        */

        function Hero(name,age,sex,level){
            this.name = name;
            this.age = age;
            this.sex = sex;
            this.level = level;

            this.sing = function(address){
                console.log('来' + address + '开演唱会');
            }
            // console.log(this);
        }

        // 通过构造函数，创建对象
        let jason = new Hero('张杰',39, true,18);
        let lvbu = new Hero('吕布', 22, true, 18);
        let zf =new Hero('张飞', 18, true,22);
        console.log(typeof lvbu);  // 是个 object
        console.log(lvbu.name);    // 吕布
        lvbu.sing('郑州');  // 来郑州开演唱会

        /* 
            总结：
                1. 构造函数就是类
                2. 通过类这个模块，可以创建对象
                3. 类是对象公共属性和方法的抽取
        */

        /* 
            构造函数：
                1. 作用，创建对象
                2. 返回值是一个对象，默认省略
                3. 封装的代码是，给对象多态的添加属性和方法
                4. this 是当前对象
                5. 函数名用大驼峰
                6. 配合关键字 new 使用
                7. 构造函数和类是一码事
                8. 就是对象公共属性和方法的抽取
                9. 属性名和形参尽量保持一致，可读性强

                约定大于规范  规范大于编码
        */
    </script>
</body>
</html>